package cn.zyq.demo.beans.pay;

import cn.zyq.demo.system.common.BaseBean;
import cn.zyq.demo.system.pay.core.enums.PayChannelEnum;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;


/**
 * 支付订单表
 * 2023-05-08 14:54:50
 */
@Entity
@Table(name = "`payOrder`")
@Data
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public class PayOrder extends BaseBean implements Serializable {

    private static final long serialVersionUID = 9106554754328510118L;

    /**
     * 主键id，用于关联
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
    @Column(name = "`payOrderID`")
    @ApiModelProperty("主键id，用于关联")
    private Integer payOrderID;

    /**
     * 商户编号
     */
    @Column(name = "`mchid`")
    @ApiModelProperty("商户编号")
    private String mchid;

    /**
     * 应用ID
     */
    @Column(name = "`appid`")
    @ApiModelProperty("应用ID")
    private String appid;

    /**
     * 渠道编号
     */
    @Column(name = "`channelId`")
    @ApiModelProperty("渠道编号")
    private Integer channelId;

    /**
     * 渠道编码
     */
    @Column(name = "`channelCode`")
    @ApiModelProperty("渠道编码")
    private String channelCode;

    /**
     * 订单号
     */
    @Column(name = "`orderCode`")
    @ApiModelProperty("订单号")
    private String orderCode;

    /**
     * 商品标题
     */
    @Column(name = "`subject`")
    @ApiModelProperty("商品标题")
    private String subject;

    /**
     * 商品描述
     */
    @Column(name = "`bodyInfo`")
    @ApiModelProperty("商品描述")
    private String bodyInfo;

    /**
     * 回调通知地址
     */
    @Column(name = "`notifyUrl`")
    @ApiModelProperty("回调通知地址")
    private String notifyUrl;

    /**
     * 通知商户支付结果的回调状态
     */
    @Column(name = "`notifyStatus`")
    @ApiModelProperty("通知商户支付结果的回调状态")
    private String notifyStatus;

    /**
     * 订单金额（原始金额）,单位：分
     */
    @Column(name = "`orderAmount`")
    @ApiModelProperty("订单金额（原始金额）,单位：元")
    private BigDecimal orderAmount;

    /**
     * 回调订单金额，单位：分
     */
    @Column(name = "`notifyAmount`")
    @ApiModelProperty("回调订单金额，单位：元")
    private BigDecimal notifyAmount;

    /**
     * 回调用户实际支付金额
     */
    @Column(name = "`notifyPayerAmount`")
    @ApiModelProperty("回调用户实际支付金额")
    private BigDecimal notifyPayerAmount;

    /**
     * 道手续费，单位：百分比
     */
    @Column(name = "`channelFeeRate`")
    @ApiModelProperty("道手续费，单位：百分比")
    private Double channelFeeRate;

    /**
     * 渠道手续金额，单位：分
     */
    @Column(name = "`channelFeeAmount`")
    @ApiModelProperty("渠道手续金额，单位：元")
    private BigDecimal channelFeeAmount;

    /**
     * 支付状态（0 待支付；1 下单成功-支付中；2 下单失败；3 回调成功-支付失败 4 回调成功-支付成功。）
     */
    @Column(name = "`status`")
    @ApiModelProperty("支付状态（0 待支付；1 下单成功-支付中；2 下单失败；3 回调成功-支付失败 4 回调成功-支付成功。）")
    private Integer status;

    /**
     * 用户ip地址
     */
    @Column(name = "`usersIp`")
    @ApiModelProperty("用户ip地址")
    private String usersIp;

    /**
     * 订单失效时间
     */
    @Column(name = "`expireTime`")
    @ApiModelProperty("订单失效时间")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expireTime;

    /**
     * 订单支付成功时间
     */
    @Column(name = "`successTime`")
    @ApiModelProperty("订单支付成功时间")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime successTime;

    /**
     * 订单支付通知时间
     */
    @Column(name = "`notifyTime`")
    @ApiModelProperty("订单支付通知时间")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime notifyTime;

    /**
     * 支付成功的订单拓展单编号
     */
    @Column(name = "`channelOrderNo`")
    @ApiModelProperty("支付成功的订单拓展单编号")
    private String channelOrderNo;

    /**
     * 退款请求单号
     */
    @Column(name = "`refundOrderNo`")
    @ApiModelProperty("退款请求单号")
    private String refundOrderNo;

    /**
     * 退款状态
     */
    @Column(name = "`refundStatus`")
    @ApiModelProperty("退款状态")
    private String refundStatus;

    /**
     * 退款次数
     */
    @Column(name = "`refundTimes`")
    @ApiModelProperty("退款次数")
    private Integer refundTimes;

    /**
     * 退款总金额，单位：分
     */
    @Column(name = "`refundAmount`")
    @ApiModelProperty("退款总金额，单位：元")
    private BigDecimal refundAmount;

    /**
     * 回调信息（第三方支付回调响应信息）
     */
    @Column(name = "`notifyInfo`")
    @ApiModelProperty("回调信息（第三方支付回调响应信息）")
    private String notifyInfo;

    /**
     * 支付渠道用户编号
     */
    @Column(name = "`channelUserId`")
    @ApiModelProperty("支付渠道用户编号")
    private String channelUserId;

    /**
     * 第三方支付请求响应信息
     */
    @Column(name = "`payReqRespInfo`")
    @ApiModelProperty("第三方支付请求响应信息")
    private String payReqRespInfo;

    /**
     * 用户ID
     */
    @Column(name = "`userID`")
    @ApiModelProperty("用户ID")
    private Integer userID;

    /**
     * 所属业务类型（1、商品订单；2、喂食订单）
     */
    @Column(name = "`type`")
    @ApiModelProperty("所属业务类型（1、商品订单；2、喂食订单）")
    private Integer type;

    /**
     * 关联业务订单ID
     */
    @Column(name = "`relatedOrderID`")
    @ApiModelProperty("关联业务订单ID")
    private Integer relatedOrderID;

    /**
     * 业务类型（1、推广收益；2、充值；3、提现；4、喂食支出；5、喂食收益；6、认养支出；7、认养收益）
     */
    @Column(name = "`businessType`")
    @ApiModelProperty("业务类型（1、推广收益；2、充值；3、提现；4、喂食支出；5、喂食收益；6、认养支出；7、认养收益）")
    private Integer businessType;

    /**
     * 平台服务收费（单位：分）
     */
    @Column(name = "`serviceCharge`")
    @ApiModelProperty("平台服务收费（单位：元）")
    private BigDecimal serviceCharge;

    /**
     * 第三方支付请求响应信息
     */
    @Column(name = "`payReqResp`")
    @ApiModelProperty("第三方支付请求响应信息")
    private String payReqResp;

    /**
     * 父级支付订单
     */
    @Column(name = "`parentPayOrderID`")
    @ApiModelProperty("父级支付订单")
    private Integer parentPayOrderID;

    /**
     * 退款原因
     */
    @Column(name = "`refundReason`")
    @ApiModelProperty("退款原因")
    private String refundReason;

    /**
     * 渠道退款单编号
     */
    @Column(name = "`channelRefundId`")
    @ApiModelProperty("渠道退款单编号")
    private String channelRefundId;

    /**
     * 下单用户昵称
     */
    @ApiModelProperty("下单用户昵称")
    @Transient
    private String nickName;

    /**
     * 下单用户电话
     */
    @ApiModelProperty("下单用户电话")
    @Transient
    private String phone;


    public PayOrder() {
    }

    /**
     * 初始支付订单
     *
     * @param channelId      支付渠道的编码的枚举
     * @param orderCode      订单号
     * @param subject        商品标题
     * @param bodyInfo       商品描述
     * @param usersIp        用户ip
     * @param userID         用户id
     * @param type           所属业务类型（1、商品订单；2、喂食订单）
     * @param relatedOrderID 关联业务订单ID
     * @param orderAmount    订单金额
     */
    public PayOrder(Integer channelId, String orderCode, String subject, String bodyInfo,
                    String usersIp, Integer userID, Integer type, Integer relatedOrderID,
                    BigDecimal orderAmount, Integer businessType, BigDecimal serviceCharge, LocalDateTime expireTime) {
        this.channelId = channelId;
        this.channelCode = PayChannelEnum.getChannelIdByValue(channelId);
        this.orderCode = orderCode;
        this.subject = subject;
        this.bodyInfo = bodyInfo;
        this.usersIp = usersIp;
        this.userID = userID;
        this.type = type;
        this.relatedOrderID = relatedOrderID;
        this.orderAmount = orderAmount;
        this.businessType = businessType;
        this.serviceCharge = serviceCharge;
        this.expireTime = expireTime;
    }

}
